home *** CD-ROM | disk | FTP | other *** search
/ The 640 MEG Shareware Studio 4 / The 640 Meg Shareware Studio CD-ROM Volume IV (Data Express)(1994).ISO / clang / 120_01.zip / META40.C < prev    next >
Text File  |  1993-06-01  |  8KB  |  412 lines

  1. /* HEADER: CUG120.14;
  2.    TITLE: META4;
  3.    VERSION: 1.0;
  4.    DATE: 08/00/1981;
  5.    DESCRIPTION: "Dr. W.A. Gale's META4 compiler-compiler from DDJ August 1981";
  6.    KEYWORDS: compiler-compiler,programming languages;
  7.    SYSTEM: CP/M;
  8.    FILENAME: META40.C;
  9.    CRC: FBB6;
  10.    AUTHORS: W.A.Gale, Jan Larsson;
  11.    COMPILERS: BDS C;
  12.    REFERENCES: AUTHORS: W.A.Gale; TITLE: "META4 Compiler-Compiler";
  13.     CITATION: "Doctor Dobb's Journal, August 1981" ENDREF;
  14. */
  15.  
  16. #include "meta40.h"
  17.  
  18.  
  19.  
  20. main( argc, argv )
  21. int argc ;
  22. char **argv ;
  23. {
  24.     spcharflag = eoflag = printflag = FALSE ;
  25.     strcpy( m4file, argv[1] );
  26.     strcpy( metfile, argv[2] );
  27.     strcpy( outfile, argv[3] );
  28.     newext( m4file, ".M4" );
  29.     if(argc < 4){
  30.             puts("Usage: A>M4 <m4_file> <source_file> <target_file>\n");
  31.             exit();
  32.             }
  33.     iav[1] = m4file;
  34.     iav[2] = metfile;
  35.     iav[3] = outfile;
  36.     iac = argc ;
  37.     nl = '\n' ;
  38.     puts("\n Meta4 Compiler-Compiler ver 1.0");
  39.     puts("\n Copyright (c) 1981 W.A. Gale\n\n");
  40.     fin();
  41.     frc();
  42.     if(argc > 4)printflag = TRUE ; else printflag = FALSE ;
  43.     fli();
  44.     ipc = 0 ;
  45. loc00:    
  46.     fgi();
  47.     cc = ri[c0] ;
  48.     switch (cc) {
  49.         case 'l' : 
  50.             if(pi == c1)aa = TRUE ; else aa = FALSE ;
  51.              if(aa){
  52.                 if(fl){
  53.                     flw(); 
  54.                     ism++ ; 
  55.                     }
  56.                 else pl = pm ; 
  57.                 }
  58.             else { 
  59.                 cc = ri[c1];
  60.                 switch (cc) {
  61.                     case 'm' : 
  62.                         fl = 0 ;
  63.                         bb = 2 ;
  64.                         while(TRUE){
  65.                             if(bb < pi)aa = TRUE ; else aa = FALSE ;
  66.                             if(!aa)break;
  67.                             aa = ri[bb] ;
  68.                             dd = ns[pl];
  69.                             if(aa != dd)aa = TRUE ; else aa = FALSE;
  70.                             if(aa)goto loc99; 
  71.                             bb++;
  72.                             fla();
  73.                             }
  74.                         fl = 1 ;
  75.                         flb();
  76.                         break ;
  77.                     case 'i' :  
  78.                         fl = 0 ;
  79.                         cc = ns[pl];
  80.                         po = 0 ;
  81.                         fza();
  82.                         while(TRUE){
  83.                             if(!aa)break;
  84.                                os[po] = cc ;
  85.                             po++ ;
  86.                             fla();
  87.                             cc = ns[pl];
  88.                             fza();
  89.                             dd = aa ;
  90.                             fzn();
  91.                             aa = dd | aa ;
  92.                             }
  93.                         if(po == c0)aa = TRUE ; else aa = FALSE ;
  94.                         if(aa)goto loc99 ;
  95.                         fms();
  96.                         ipr[c0] = iaa ;
  97.                         fl = 1 ;
  98.                         break ;
  99.                     case 'n' : 
  100.                         fl = 0 ;
  101.                         iaa = i00 ;
  102.                         while(TRUE){
  103.                             cc = ns[pl];
  104.                             fzn();
  105.                             if(!aa)break;
  106.                             fl = 1 ;
  107.                             iaa = iaa * 10 ;
  108.                             cc = cc - '0' ;
  109.                             ibb = cc ;
  110.                             iaa += ibb ;
  111.                             fla();
  112.                             }
  113.                         ipr[c0] = iaa ;
  114.                         break;
  115.                     case 'h' : 
  116.                         fl = 0 ;
  117.                         iaa = 0 ;
  118.                         while(TRUE){
  119.                             cc = ns[pl];
  120.                             fzh();
  121.                             if(!aa)break;
  122.                             fl = 1 ;
  123.                             iaa *= 16 ;
  124.                             ibb = cc ;
  125.                             iaa += ibb ;
  126.                             fla();
  127.                             };
  128.                         ipr[c0] = iaa ;
  129.                         break ;
  130.                     case 'q' : 
  131.                         dd = ri[c2];
  132.                         cc = ns[pl];
  133.                         po = 0 ;
  134.                         if(cc == dd)aa = TRUE ; else aa = FALSE ;
  135.                         if(aa){
  136.                             fla();
  137.                             while(TRUE){
  138.                                 cc = ns[pl];
  139.                                 if(cc != nl)aa=TRUE;else aa=FALSE;
  140.                                 if(cc != dd)bb=TRUE;else bb=FALSE;
  141.                                 aa &= bb ;
  142.                                 if(!aa)break;
  143.                                 os[po] = cc ;
  144.                                 po++ ;
  145.                                 fla();
  146.                                 }
  147.                             fla();
  148.                             if(cc == nl)aa = TRUE ; else aa = FALSE;
  149.                             if(aa){
  150.                                 iln++ ;
  151.                                 ism = i00 ;
  152.                                 }
  153.                             else ;
  154.                             fl = 1 ;
  155.                             }
  156.                         else fl = 0 ;                
  157.                         break ;
  158.                     default :
  159.                         puts("Not lex: ");
  160.                         putchar(cc);putchar('\n');
  161.                     }
  162.                     
  163.                 }
  164.             break;
  165.         case 'f' : 
  166.             if(!fl)goto loc20;
  167.             break;
  168.         case 'p' : 
  169.             bb = 1 ;
  170.             while(TRUE){
  171.                 if(bb < pi)aa = TRUE ; else aa = FALSE ;
  172.                 if(!aa)break ;
  173.                 cc = ri[bb];
  174.                 bo[pb] = cc ;
  175.                 pb++ ;
  176.                 bb++ ;
  177.                 }
  178.             break ;
  179.         case 'o' : 
  180.             bb = 0 ;
  181.             while(TRUE){
  182.                 if(bb < pb)aa = TRUE ; else aa = FALSE ;
  183.                 if(!aa)break;
  184.                 cc = bo[bb];
  185.                 bb++;
  186.                 pchar( cc, f2 );
  187.                 }
  188.             pb = c0 ;
  189.             if(pi == c1)aa = TRUE ; else aa = FALSE ;
  190.             if(aa)pchar( '\n', f2 );
  191.             break ;
  192.         case 'x' : 
  193.             if(pi == c1)aa = TRUE ; else aa = FALSE ;
  194.             if(aa){ 
  195.                 if(fl);else {
  196. loc98:                puts("Error at line num: ");
  197.                     iaa = iln ;
  198.                     fpn() ;
  199.                     puts(" symbol  ");
  200.                     iaa = ism ;
  201.                     fpn();
  202.                     putchar(cb);
  203.                     putchar('\n');
  204.                     while(TRUE){
  205.                         cc = ns[pl];
  206.                         if(cc != zx)aa=TRUE;else aa=FALSE;
  207.                         if(cc != c0)bb=TRUE;else bb=FALSE;
  208.                         aa &= bb ;
  209.                         if(!aa)break;
  210.                         if(cc == nl)aa=TRUE;else aa=FALSE;
  211.                         if(aa){
  212.                             iln++;
  213.                             ism = 0;    
  214.                             }
  215.                         else ;
  216.                         fla(); 
  217.                         flb(); 
  218.                         }
  219.                     if(cc == c0)bb = TRUE ; else bb = FALSE ;
  220.                     if(bb){   
  221.                         puts("\nEOF recognized\n");
  222.                         goto loc21 ;
  223.                         }
  224.                     else ;
  225.                     fla(); 
  226.                     flb();                    
  227.                     flw(); 
  228.                     ipc = izc ; 
  229.                     ipt = izt ; 
  230.                     fl = 1 ; 
  231.                     }   
  232.                 }
  233.             else { 
  234.                 cc = ri[c1];
  235.                 switch (cc) {
  236.                     case 'n' : 
  237.                         iaa = iln ;
  238.                            fwn();
  239.                         break;
  240.                     case 'o' :
  241.                         bb = 0 ;
  242.                         while(TRUE){
  243.                             if(bb < pb)aa = TRUE ; else aa = FALSE ;
  244.                             if(!aa)break;
  245.                             cc = bo[bb];
  246.                             bb++ ;
  247.                             putchar( cc );
  248.                             }
  249.                         putchar('\n');
  250.                         pb = c0 ;
  251.                         break;
  252.                     case 'm' : 
  253.                         izc = ipc ; 
  254.                         izt = ipt ; 
  255.                         zx = ri[c2]; 
  256.                         break;
  257.                     default: ;
  258.                     }
  259.                 } 
  260.             break;
  261.         case 't' : 
  262.             if(fl){
  263.                 goto loc20;
  264.                 }
  265.             else ;
  266.             break;
  267.         case 'g' : 
  268.             wa = ri[c1];
  269.             wb = ri[c2];
  270.             ipt += i03 ;
  271.             iaa = 597 ; 
  272.             if(iaa <= ipt)aa = TRUE ; else aa = FALSE ;
  273.             if(aa){
  274.                 puts("stack overflow >>>>\n");
  275.                 goto loc98 ;
  276.                 }
  277.             else ;
  278.             ist[ipt] = ipc ;
  279.             pack( &ipc, &wa, &wb );
  280.             iaa = ipt ;
  281.             iaa++;
  282.             ist[iaa]=i00 ;
  283.             iaa++;
  284.             ist[iaa] = i00 ;
  285.             break ;
  286.         case 'r' : 
  287.             ipc = ist[ ipt ];
  288.             if(ipt < i03)aa = TRUE ; else aa = FALSE ;
  289.             if(aa){
  290.                 puts("Stack underflow....\n");
  291.                 goto loc98 ;
  292.                 }
  293.             else ;
  294.             ipt = ipt - i03 ;
  295.             break;
  296.         case 's' : 
  297.             if(pi == c1)aa = TRUE ; else aa = FALSE ;
  298.             if(aa)fl = 1 ;
  299.             else {
  300.                 cc = ri[c1];
  301.                 switch (cc) {
  302.                     case 'f' : 
  303.                         fl = 0 ;
  304.                         break;
  305.                     case 'c' : 
  306.                         fl = c1 - fl ;
  307.                         break;
  308.                     default:
  309.                         puts("set error \n");
  310.                     }
  311.                 }
  312.             break;
  313.         case 'u' : 
  314.             if(pi == c1)aa = TRUE ; else aa = FALSE ;
  315.             if(aa){ 
  316.                 iaa = ipt ;        
  317.                 iaa++;
  318. loc10:
  319.                 ibb = ist[iaa]; 
  320.                 if(ibb < i01)aa = TRUE ; else aa = FALSE ;
  321.                 if(aa){
  322.                     iuu++;
  323.                     ibb = iuu ;
  324.                     ist[iaa] = iuu ;
  325.                     }
  326.                 else ; 
  327.                 iaa = ibb ;
  328.                                ipr[c0] = iaa ;
  329.                 fwn(); 
  330.                 }
  331.             else 
  332.                 goto loc22 ;
  333.             break ;
  334.         case 'c' : 
  335.             bb = 0 ;
  336.             while(TRUE){
  337.                 if(bb < po)aa = TRUE ; else aa = FALSE ;
  338.                 if(!aa)break;
  339.                 cc = os[bb];
  340.                 bo[pb] = cc ;
  341.                 pb++ ; bb++ ;
  342.                 }
  343.             break;
  344.         case 'v' : 
  345.             if(pi == c1)aa = TRUE ;else aa = FALSE ;
  346.             if(aa){
  347.                 iaa = ipt ;
  348.                 iaa++ ; iaa++ ;
  349.                 goto loc10 ; 
  350.                 }
  351.             else 
  352.                 goto loc22 ;
  353.             break;
  354.         case 'm' : 
  355.             cc = ri[c1];
  356.             switch (cc) {
  357.                 case 's' : fmh() ; break ; 
  358.                 case 'p' : fmp() ; break ; 
  359.                 case 'e' : fme();ipr[c0]=iaa;break; 
  360.                 case 'q' : fms();ipr[c0]=iaa;break ; 
  361.                 case 'c' : fmc();ipr[c0]=iaa;break; 
  362.                 case 'd' : fmd();ipr[c0]=iaa;break; 
  363.                 case 'i' : 
  364.                         cc = ri[c2];
  365.                         fzn();
  366.                         if(aa)mk = cc - x0 ; 
  367.                         else mk = c2 ;
  368.                         fmi();
  369.                         break;
  370.                 default  : puts("Illegal memory operation.\n");
  371.                 }
  372.             break;
  373.         case 'j' : 
  374.             aa = aa ;
  375. loc20:
  376.             aa = ri[c1];
  377.             bb = ri[c2];
  378.             pack( &ilb,&aa,&bb);
  379.             ipc = ilt[ilb];
  380.             break;
  381.         case 'e' : 
  382.             aa = aa ;
  383. loc21:
  384.             pchar( CPMEOF, f2 );
  385.             fflush( f2 );
  386.             xclose( f1 );
  387.             xclose( f2 );
  388.             iaa = imm ; 
  389.             fpn();
  390.             puts(" max memory used\n");
  391.             exit();
  392.         default : 
  393.             aa = aa ;
  394. loc22:                    qi = 0 ;
  395.             fft();
  396.             ffi();
  397.             fst();
  398.         }
  399.     goto loc00;
  400. loc99:
  401.     fl = 0 ;
  402.     goto loc00;
  403. }
  404.  
  405.  
  406.  
  407.  
  408.         goto loc98 ;
  409.                 }
  410.             else ;
  411.             ipt = ipt - i03 ;
  412.             break;